package com.drugmanage.service.impl;

import com.drugmanage.Base.BaseService;
import com.drugmanage.constant.DmConstant;
import com.drugmanage.dao.ModuleDao;
import com.drugmanage.dao.PermissionDao;
import com.drugmanage.dao.RoleDao;
import com.drugmanage.dao.dto.TreeDto;
import com.drugmanage.entity.Module;
import com.drugmanage.query.ModuleQuery;
import com.drugmanage.service.IModuleService;
import com.drugmanage.utils.AssertUtil;
import com.drugmanage.utils.ValidateUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

@Service
public class ModuleService extends BaseService<Module> implements IModuleService{

    @Resource
    private ModuleDao moduleDao;
    @Resource
    private RoleDao roleDao;
    @Resource
    private PermissionDao permissionDao;

    @Override
    public List<TreeDto> queryAllModules(Integer roleId) {
        /**
         * 1.根据角色查询角色已授权的模块id List<Integer>
         * 2.查询所有模块数据  List<TreeDto>
         * 3.循环遍历List<TreeDto>
         */
        AssertUtil.isTure(ValidateUtil.nullOrZeroInteger(roleId)||roleDao.queryById(roleId)==null,"角色不存在");
        List<Integer> moduleIds = permissionDao.queryModuleIdsByRoleId(roleId);
        List<TreeDto> treeDtos;
        treeDtos = moduleDao.queryAllModules();

        if(ValidateUtil.blankList(treeDtos)){
           for (TreeDto treeDto : treeDtos) {
              if(ValidateUtil.blankList(moduleIds)){
                  if(moduleIds.contains(treeDto.getId())){
                      treeDto.setChecked(true);
                  }
              }
           }
       }
        return treeDtos;
    }

    @Override
    public void saveModule(Module module) {
        checkModuleParams(module.getModuleName(),module.getOptValue(),module.getGrade());
        Module temp = null;
        if(module.getGrade()!=2){
            temp= moduleDao.queryModuleByName(module.getModuleName());
            AssertUtil.isTure(null!=temp, "该模块已存在");
            temp = moduleDao.queryModuleByOptValue(module.getOptValue());
            AssertUtil.isTure(null!=temp, "该模块已存在");
        }
        module.setCreateDate(new Date());
        module.setUpdateDate(new Date());
        module.setIsValid(true);

        AssertUtil.isTure(moduleDao.save(module)<1, DmConstant.OP_FAILED_MSG);
    }

    private void checkModuleParams(String modulename, String optvalue, Integer grade) {
        AssertUtil.isTure(StringUtils.isBlank(modulename), "模块名称非空！！");
        AssertUtil.isTure(StringUtils.isBlank(optvalue), "权限值非空！");
        AssertUtil.isTure(null==grade||(grade!=0&&grade!=1&&grade!=2), "层级值非法!");
    }

    @Override
    public void updateModule(Module module) {
        checkModuleParams(module.getModuleName(),module.getOptValue(),module.getGrade(), module.getId());
        Module temp = null;
        if(module.getGrade()!=2){
            temp = moduleDao.queryModuleByName(module.getModuleName());
            AssertUtil.isTure(null!=temp&&temp.getId()!=module.getId(),"该模块已存在");
            temp = moduleDao.queryModuleByOptValue(module.getOptValue());
            AssertUtil.isTure(null!=temp&&temp.getId()!=module.getId(), "该模块已存在");
        }
        module.setUpdateDate(new Date());
        AssertUtil.isTure(moduleDao.update(module)<1, DmConstant.OP_FAILED_MSG);
    }

    private void checkModuleParams(String moduleName, String optValue, Integer grade, Integer id) {
        checkModuleParams(moduleName,optValue,grade);
        AssertUtil.isTure(null==id||null==moduleDao.get(id), "待更新记录不存在！");
    }

    @Override
    public void deleteModule(Integer moduleId) {
        /**
         * 思路1:
         *    查询记录 判断层级
         *       根级
         *          删除根级  一级  二级菜单级联删除
         *       一级
         *          删除一级菜单  二级菜单
         *        二级菜单
         *           删除二级菜单
         *       ...
         *  思路2:根据mid
         *      根据根记录查询根记录下所有的子记录
         *        根据pid 查询子记录
         *        递归查询子记录
         */

        List<Integer> results = new ArrayList<Integer>();
        results = getSubModuleIds(moduleId,results);
        if(null!=results&&results.size()>0){
            AssertUtil.isTure(moduleDao.deleteModulesBatch(results)<results.size(), DmConstant.OP_FAILED_MSG);
        }
    }

    @Override
    public Map<String, Object> searchModuleByParams(ModuleQuery moduleQuery) {
        PageHelper.startPage(moduleQuery.getPage(),moduleQuery.getRows());
        PageInfo<Module> pageInfo=new PageInfo<Module>(moduleDao.queryForPage(moduleQuery));
        Map<String, Object> map=new HashMap<String, Object>();
        map.put("total", pageInfo.getTotal());
        map.put("rows", pageInfo.getList());
        return map;
    }

    @Override
    public List<Module> queryModulesByGrade(Integer grade) {

        return moduleDao.queryModulesByGrade(grade);
    }

    private List<Integer> getSubModuleIds(Integer moduleId, List<Integer> results) {
        Module module = moduleDao.get(moduleId);
        if(null!=module){
            results.add(module.getId());
            List<Module> modules = moduleDao.querySubModulesByPid(moduleId);
            if(ValidateUtil.blankList(modules)){
                for (Module temp : modules) {
                    results=getSubModuleIds(temp.getId(),results);
                }
            }
        }
        return results;
    }
}
